package com.titaniume.java1;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.function.Consumer;

/**
 *@program: JavaSenior
 *@description:
 *
 *  1 举例： (o1,o2) -> Integer.compare(o1,o2)
 *  2. 格式
 *      ：Lambda操作符或箭头操作符
 *       左边：Lambda形参列表，（接口中的抽象方法的形参列表）
 *       右边：Lambda体：（重写抽象方法的方法体）
 *
 * 3. Lambda表达式的使用 6种
 *
 *   总结：
 *    左边：Lambda形参列表的参数类型可以省略（类型推断）；
 *    如果Lambda参数列表只有一个参数，其一对() 可以省略
 *    右边：Lambda体使用一对{} 包裹，如果Lambda只有一条执行语句（可能是return语句）
 *    可以省略{} 和ruturn
 *
 * 4.Lambda表达式的本质：作为接口的实例
 *
 * 5.若果一个接口中，值声明了一个抽象方法，则此接口就称为函数式接口，我们可以在接口上使用
 * @FunctionInterface注解，这样可以检查它是否所以一个函数式接口
 *
 * 6.所有 用匿名实现类表示的现在都可以用Lambda表达式来写。
 *
 *
 *@author: renfei.huang
 *@create: 2021-11-02 14:57
 */
public class LambdaTest1 {


    //语法格式一： 无参，无返回值
    @Test
    public void tese1() {

        Runnable runnable2 = () -> System.out.println("java是世界上最好的语言");
        runnable2.run();

    }


    //语法格式二： Lambda 需要一个参数，但是无返回值
    @Test
    public void tese2() {

        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("我只是一句话");

        System.out.println("****************");
        Consumer<String> consumer1 = (String s) ->  System.out.println(s);
        consumer1.accept("我只是一个塔啊");

    }


    //语法格式三：数据类型可以省略，因为可以由编译器推断得出 称为类型推断
    @Test
    public void tese3() {

        System.out.println("****************");
        Consumer<String> consumer = ( s) ->  System.out.println(s);
        consumer.accept("我只是一句话");
        System.out.println("****************");
        Consumer<String> consumer1 = ( s) ->  System.out.println(s);
        consumer1.accept("我只是一个塔啊");
    }

    @Test
    public void tese4() {

        //类型推断
        ArrayList<String > list = new ArrayList<>();
        int [] arr = {1,2,3};

    }


    //语法格式四：若只有一个参数时，参数的小括号可以省略
    @Test
    public void tese5() {
        System.out.println("****************");
        Consumer<String> consumer =  s ->  System.out.println(s);
        consumer.accept("我只是一句话");
        System.out.println("****************");
        Consumer<String> consumer1 =  s ->  System.out.println(s);
        consumer1.accept("我只是一个塔啊");
    }


    //语法格式五：Lambda 需要两个或两个以上的参数时候，多条执行语句，并且可以有返回值
    @Test
    public void tese6() {

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(comparator.compare(12, 23));
        System.out.println("****************");

        Comparator<Integer> comparator1 = (o1,o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(comparator1.compare(6, 2));


    }


    //语法格式六：Lambda 只有一条语句时，return与大括号若有都可以省略
    @Test
    public void tese7() {

        Comparator<Integer> comparator = (o1,o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(comparator.compare(12, 23));
        System.out.println("****************");

        Comparator<Integer> comparator1 = (o1,o2) ->  o1.compareTo(o2);
        System.out.println(comparator1.compare(6, 2));

    }





}
